package persistence;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.util.ArrayList;
import model.Categoria;
import model.Equipo;
import persistence.connection.PoolConnection;

public class CategoriaPersistsAdm {

	private static CategoriaPersistsAdm categoriaPersistsAdm;
	
	private CategoriaPersistsAdm(){}
	
	public static CategoriaPersistsAdm getInstance(){
		
		if (categoriaPersistsAdm == null)
			categoriaPersistsAdm = new CategoriaPersistsAdm();
		
		return categoriaPersistsAdm;
	}
	
	
	public ArrayList<Categoria> getCategoriasByTorneo(int idTorneo){			
		Connection con = PoolConnection.getPoolConnection().getConnection();
		String sentencia = "select * from dbLiforBasquet.dbo.Categorias where idTorneo = ?";
		ArrayList<Categoria> categorias = new ArrayList<Categoria>();	
		
		try {			
			PreparedStatement ps = con.prepareStatement(sentencia);
			ps.setInt(1, idTorneo);
			ResultSet rs = ps.executeQuery();
			
			while (rs.next()){
				Categoria categoria = new Categoria();
				
				categoria.setDescripcion(rs.getString("descripcion"));
				categoria.setFechaInicio(new java.util.Date(rs.getDate("fechaInicio").getTime()));
				categoria.setNivel(rs.getString("nivel").charAt(0));
				categoria.setId(rs.getInt("id"));
				
				ArrayList<Equipo> equipos = EquipoPersistsAdm.getInstance().getEquiposByCategoria(categoria.getId());
				for (Equipo e : equipos){
					if (e.getParticipa()){
						categoria.addEquipoParticipante(e);
					}else{
						categoria.addEquipoNoParticipante(e);
					}
				}
				
				//FIXTURE
				//POSICIONES
				
				categorias.add(categoria);
			}		
		} catch (Exception e) {		
			System.out.println("Error al obtener Categorias por torneo: " + e.getMessage());
		}	
		
		PoolConnection.getPoolConnection().realeaseConnection(con);
		return categorias;
	}
	
	public void insert(Categoria categoria, int idTorneo){		
		Connection con = PoolConnection.getPoolConnection().getConnection();

		String sentencia = "insert into dbLiforBasquet.dbo.Categorias " +
						   " (idTorneo, fechaInicio, descripcion, nivel)" +
						   "  values (?,?,?,?)";
		
		try {			
			PreparedStatement ps = con.prepareStatement(sentencia, PreparedStatement.RETURN_GENERATED_KEYS);
			ps.setInt(1,idTorneo);
			ps.setDate(2, new java.sql.Date(categoria.getFechaInicio().getTime()));
			ps.setString(3, categoria.getDescripcion());
			ps.setString(4, String.valueOf(categoria.getNivel()));
			ps.execute();	
			
			ResultSet generatedKeys = ps.getGeneratedKeys();
			if (generatedKeys.next())
				categoria.setId(generatedKeys.getInt(1));
		} catch (Exception e) {		
			System.out.println("Error al insertar Categoria: " + e.getMessage());
		}	
		
		PoolConnection.getPoolConnection().realeaseConnection(con);
		
		for(Equipo equipo : categoria.getEquiposNoParticipantes()){
			EquipoPersistsAdm.getInstance().update(equipo, categoria.getId());
		} 
		for(Equipo equipo : categoria.getEquiposParticipantes()){
			EquipoPersistsAdm.getInstance().update(equipo, categoria.getId());
		} 
	}
}
